package com.cashbox.dao.inventario;

import com.cashbox.dao.conexiones.ConexionFactory;
import com.cashbox.exepciones.CapaDatosExcepcion;
import com.cashbox.modelos.inventario.Marca;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.RollbackException;

/**
 *
 * @author luramirez
 */
public class DaoInventarioHb implements IDaoInventario {

    @Override
    public List<Marca> getMarcasLista() throws CapaDatosExcepcion {
        List<Marca> result;
        try {
            Query qAll = ConexionFactory.getInstance().getEntitiManager().createNamedQuery("Marca.findAll");
            result = qAll.getResultList();
        } catch (NullPointerException ex) {
            throw new CapaDatosExcepcion("La Conexion es Nula o Hay Problemas en la Red.");
        } catch (Exception ex) {
            throw new CapaDatosExcepcion(ex.getMessage());
        }
        return result;
    }

    @Override
    public Marca getMarcaByClave(Long id) throws CapaDatosExcepcion {
        Marca result;
        try {
            Query qById = ConexionFactory.getInstance().getEntitiManager().createNamedQuery("Marca.findById");
            qById.setParameter("id", id);
            result = (Marca) qById.getSingleResult();
        } catch (NullPointerException ex) {
            throw new CapaDatosExcepcion("La Conexion es Nula o Hay Problemas en la Red.");
        } catch (Exception ex) {
            throw new CapaDatosExcepcion(ex.getMessage());
        }
        return result;
    }

    @Override
    public void procesarMarcas(List<Marca> marcas) throws CapaDatosExcepcion {
        try {
            EntityManager em = ConexionFactory.getInstance().getEntitiManager();
            try {
                em.getTransaction().commit();
                em.getTransaction().begin();
            } catch (RollbackException rex) {
                em.getTransaction().begin();
                List<Marca> merged = new ArrayList<>(marcas.size());
                for (Marca marca : marcas) {
                    merged.add(marca);
                }
                marcas.clear();
                marcas.addAll(merged);
            }
        } catch (NullPointerException ex) {
            throw new CapaDatosExcepcion("La Conexion es Nula o Hay Problemas en la Red.");
        } catch (Exception ex) {
            throw new CapaDatosExcepcion(ex.getMessage());
        }

    }

    @Override
    public void nuevaMarca(Marca marca) throws CapaDatosExcepcion {
        try {
            EntityManager em = ConexionFactory.getInstance().getEntitiManager();
            em.persist(marca);
        } catch (NullPointerException ex) {
            throw new CapaDatosExcepcion("La Conexion es Nula o Hay Problemas en la Red.");
        } catch (Exception ex) {
            throw new CapaDatosExcepcion(ex.getMessage());
        }
    }

    @Override
    public void eliminarMarca(Marca marca) throws CapaDatosExcepcion {
        try {
            EntityManager em = ConexionFactory.getInstance().getEntitiManager();
            em.remove(marca);
        } catch (NullPointerException ex) {
            throw new CapaDatosExcepcion("La Conexion es Nula o Hay Problemas en la Red.");
        } catch (Exception ex) {
            throw new CapaDatosExcepcion(ex.getMessage());
        }
    }
}
